home *** CD-ROM | disk | FTP | other *** search
/ Large Pack of OldSkool DOS MOD Trackers / buzzmachines_massive.exe / Dev / Overloader - Raw Recorder / buzzrawrecorder.cpp next >
Encoding:
C/C++ Source or Header  |  2002-03-03  |  8.5 KB  |  282 lines

  1. #include <stdio.h>
  2. #include <assert.h>
  3. #include <string.h>
  4. #include <windows.h>
  5. #include "resource.h"
  6.   
  7. double const PI = 3.14159265358979323846;
  8.  
  9. HINSTANCE dllInstance;
  10.  
  11. #define MAX_BUFFER_LENGTH        256            // in number of samples
  12.  
  13. class COOERecorder {
  14. public:
  15.     virtual bool __cdecl Init();
  16.  
  17.     virtual bool __cdecl IsMultiTrack();
  18.     virtual bool __cdecl IsTagged();
  19.     virtual bool __cdecl IsStreamed();
  20.     virtual bool __cdecl IsRequiresWaveout();
  21.     virtual bool __cdecl IsLossyCompression();
  22.  
  23.     virtual bool __cdecl IsSampleRateChangeable();
  24.     virtual bool __cdecl SampleRateChanged(int samplerate);
  25.     virtual bool __cdecl IsBitRateChangeable();
  26.     virtual bool __cdecl BitRateChanged(int bitrate);
  27.  
  28.     virtual bool __cdecl SupportsSampleRate(int samplerate);
  29.     virtual bool __cdecl SupportsBitRate(int bitrate);
  30.  
  31.     virtual bool __cdecl SaveAs(HWND parentwindow);
  32.     virtual bool __cdecl ReadyToRec();
  33.  
  34.     virtual bool __cdecl TrackNames(int track_id, char *track_name);
  35.     virtual bool __cdecl SongTagData(int tag_index, char *tagdata);
  36.  
  37.     virtual bool __cdecl Start(char * filename, int samplespersec);
  38.     virtual bool __cdecl WorkOutput(float *psamples, int numsamples);
  39.     virtual bool __cdecl WorkOutputMulti(int track_id, float *psamples, int numsamples);
  40.  
  41.     virtual bool __cdecl Finish();
  42.     virtual void __cdecl ConfigDlg(HWND parentwindow);
  43.     virtual void __cdecl DispatchCommand(int command_id, int param1, int param2, int param3, int param4);
  44.     virtual void __cdecl DispatchCommandEx(char * str_command, char * str_value);
  45.  
  46.     virtual void __cdecl LoadSettings(char * settingsname, char *username, char *domain);
  47.     virtual void __cdecl SaveSettings(char * settingsname, char *username, char *domain);
  48.  
  49.     virtual char * __cdecl OutputFilename();
  50.     virtual char * __cdecl OutputSize();
  51.     virtual char * __cdecl ExtraInfo(int extra_info_id);
  52.     virtual char * __cdecl RecordersWebSiteURL();
  53.  
  54.     virtual int __cdecl RecorderVersion();
  55.  
  56.     virtual void GetRecorderExtensionsClass(int param, void **exmodule);
  57. };
  58.  
  59. class rec : public COOERecorder {
  60. public:
  61.     virtual bool __cdecl Init();
  62.  
  63.     virtual bool __cdecl IsMultiTrack() { return false; };
  64.     virtual bool __cdecl IsTagged() { return false; };
  65.     virtual bool __cdecl IsStreamed() { return false; };
  66.     virtual bool __cdecl IsRequiresWaveout() { return false; };
  67.     virtual bool __cdecl IsLossyCompression() { return false; };
  68.  
  69.     virtual bool __cdecl IsSampleRateChangeable() { return false; };
  70.     virtual bool __cdecl SampleRateChanged(int samplerate) { return false; };
  71.     virtual bool __cdecl IsBitRateChangeable() { return false; };
  72.     virtual bool __cdecl BitRateChanged(int bitrate) { return false; };
  73.  
  74.     virtual bool __cdecl SupportsSampleRate(int samplerate) { return true; };
  75.     virtual bool __cdecl SupportsBitRate(int bitrate) { return true; };
  76.  
  77.     virtual bool __cdecl SaveAs(HWND parentwindow);
  78.     virtual bool __cdecl ReadyToRec();
  79.  
  80.     virtual bool __cdecl TrackNames(int track_id, char *track_name) { return false; };
  81.     virtual bool __cdecl SongTagData(int tag_index, char *tagdata) { return false; };
  82.  
  83.     virtual bool __cdecl Start(char * filename, int samplespersec);
  84.     virtual bool __cdecl WorkOutput(float *psamples, int numsamples);
  85.     virtual bool __cdecl WorkOutputMulti(int track_id, float *psamples, int numsamples) { return false; };
  86.  
  87.     virtual bool __cdecl Finish();
  88.     virtual void __cdecl ConfigDlg(HWND parentwindow);
  89.     virtual void __cdecl DispatchCommand(int command_id, int param1, int param2, int param3, int param4);
  90.     virtual void __cdecl DispatchCommandEx(char * str_command, char * str_value);
  91.  
  92.     virtual void __cdecl LoadSettings(char * settingsname, char *username, char *domain) { };
  93.     virtual void __cdecl SaveSettings(char * settingsname, char *username, char *domain) { };
  94.  
  95.     virtual char * __cdecl OutputFilename();
  96.     virtual char * __cdecl OutputSize();
  97.     virtual char * __cdecl ExtraInfo(int extra_info_id) { return "No Extra Info"; };
  98.     virtual char * __cdecl RecordersWebSiteURL() { return "http://www.buzzscene.ca"; };
  99.  
  100.     virtual int __cdecl RecorderVersion() { return 100; };
  101.  
  102.     virtual void GetRecorderExtensionsClass(int param, void **exmodule) { };
  103. public:
  104.     char myfilename[255];
  105.     FILE * myfilehandle;
  106.     int writtensofar;
  107.     int bitdepth;
  108. };
  109.  
  110. bool rec::Init(){
  111.     sprintf(myfilename, "");
  112.     myfilehandle = NULL;
  113.     writtensofar = 0;
  114.     bitdepth = 0;
  115.     return true;
  116. }
  117. bool rec::SaveAs(HWND parentwindow){
  118.     OPENFILENAME ofl;
  119.     char filename[255];
  120.     int nSuccess;
  121.  
  122.     sprintf(filename,"untitled.raw");
  123.     ofl.lStructSize = sizeof(ofl);
  124.     ofl.hwndOwner = parentwindow;
  125.     ofl.hInstance = dllInstance;
  126.     ofl.lpstrFilter = "Raw 32-bit Float (*.raw)\0*.raw\0";
  127.     ofl.lpstrCustomFilter = NULL;
  128.     ofl.nMaxCustFilter = NULL;
  129.     ofl.nFilterIndex = 1;
  130.     ofl.lpstrFile = filename;
  131.     ofl.nMaxFile = 255;
  132.     ofl.lpstrFileTitle = NULL;
  133.     ofl.nMaxFileTitle = NULL;
  134.     ofl.lpstrInitialDir = NULL;
  135.     ofl.lpstrTitle = "Save Song Output as";
  136.     ofl.Flags = OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST;
  137.     ofl.nFileOffset = 0;
  138.     ofl.nFileExtension = 0;
  139.     ofl.lpstrDefExt = ".raw";
  140.     ofl.lCustData = NULL;
  141.     ofl.lpfnHook = NULL;
  142.     ofl.lpTemplateName = NULL;
  143.     nSuccess = GetSaveFileName(&ofl);
  144.     if (nSuccess == 0) {
  145.         sprintf(myfilename, "");
  146. //        SetWindowText(GetDlgItem(hDlg, IDC_FILENAMEBTN), "Save As...");
  147.     } else {
  148.         sprintf(myfilename, ofl.lpstrFile);
  149. //        SetWindowText(GetDlgItem(hDlg, IDC_FILENAMEBTN), ext_hdfilename);
  150.     }
  151.     return true;
  152. }
  153. char *rec::OutputFilename() {
  154.     return myfilename;
  155. }
  156. bool rec::Start (char * filename, int samplespersec) {
  157.     //MessageBox(NULL, "start", "blah", MB_OK);
  158.     myfilehandle = fopen(filename, "wb");
  159.     writtensofar = 0;
  160.     return true;
  161. }
  162. bool rec::ReadyToRec() {
  163.     if (strcmp(myfilename, "") == 0) {
  164.         return false;
  165.     } else {
  166.         return true;
  167.     }
  168.  
  169. }
  170.  
  171. bool rec::WorkOutput (float *psamples, int numsamples) {
  172.     if (bitdepth == 1) {
  173.         short psampsm[1024];
  174.         for (int i = 0; i < (numsamples * 2); i++) {
  175.             if (psamples[i] > 32767.0f) psamples[i] = 32767.0f;
  176.             if (psamples[i] < -32766.0f) psamples[i] = -32766.0f;
  177.             psampsm[i] = (short)psamples[i];
  178.         }
  179.         writtensofar += numsamples;
  180.         fwrite(psampsm, sizeof(short), numsamples * 2,myfilehandle);
  181.     } else {
  182.         for (int i = 0; i < (numsamples * 2); i++) {
  183.             psamples[i] *= 0.00003f; 
  184.         }
  185.         writtensofar += numsamples;
  186.         fwrite(psamples, sizeof(float), numsamples * 2,myfilehandle);
  187.     }
  188.     return true;
  189. }
  190.  
  191. bool rec::Finish() {
  192.     fflush(myfilehandle);
  193.     fclose(myfilehandle);
  194.     return true;
  195. }
  196.  
  197. char * rec::OutputSize() {
  198.     static char megs[32];
  199.     if (bitdepth == 1) {
  200.         sprintf(megs, "%.2fM", ((float)writtensofar * 4.0f / 1024.0f / 1024.0f));
  201.     } else {
  202.         sprintf(megs, "%.2fM", ((float)writtensofar * 2.0f * (float)sizeof(float) / 1024.0f / 1024.0f));
  203.     }
  204.     return megs;
  205. }
  206.  
  207. rec *prec;
  208.  
  209. BOOL APIENTRY ConfigDialog (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  210.     switch(uMsg) {
  211.     case WM_INITDIALOG:
  212.     {
  213.         if (prec->bitdepth == 1) {
  214.             CheckDlgButton(hDlg,IDC_RADIO16,1);
  215.         } else {
  216.             CheckDlgButton(hDlg,IDC_RADIO32,1);
  217.         }
  218.         return 1;
  219.     }
  220.     case WM_SHOWWINDOW:
  221.     {
  222.         return 1;
  223.     }
  224.     case WM_CLOSE:
  225.     {
  226.         EndDialog (hDlg, TRUE);
  227.     }
  228.     case WM_COMMAND:
  229.         switch ( LOWORD (wParam))
  230.         {
  231.         case IDOK:
  232.             
  233.             if (IsDlgButtonChecked(hDlg, IDC_RADIO32) == 1) { prec->bitdepth = 0; }
  234.             if (IsDlgButtonChecked(hDlg, IDC_RADIO16) == 1) { prec->bitdepth = 1; }
  235.  
  236.             EndDialog (hDlg, TRUE);
  237.             break;
  238.         case IDCANCEL:
  239.             EndDialog (hDlg, TRUE);
  240.             break;
  241.         default:
  242.             return 0;
  243.         }
  244.         break;
  245.     }
  246.     return 0;
  247. }
  248.  
  249. void rec::ConfigDlg (HWND parentwindow) {
  250.     prec = this;
  251.     DialogBox(dllInstance, MAKEINTRESOURCE (IDD_CONFIG), parentwindow, (DLGPROC) &ConfigDialog);
  252. }
  253.  
  254. void rec::DispatchCommand(int command_id, int param1, int param2, int param3, int param4) {
  255.  
  256. }
  257.  
  258. void rec::DispatchCommandEx(char * str_command, char * str_value) {
  259.     if (strcmp(str_command, "about") == 0) {
  260.         // str_value is actually a pointer 
  261.         // to the parent HWND in this case
  262.         HWND parentwindow = *(HWND*)str_value; 
  263.         MessageBox(parentwindow, "Raw Recorder version 1.0", "About Raw Recorder", MB_OK | MB_ICONINFORMATION);
  264.     }
  265. }
  266.  
  267. extern "C" {
  268. __declspec(dllexport) COOERecorder * __cdecl CreateRecorder() { return new rec; }
  269. __declspec(dllexport) char * __cdecl RecInfo() { return "Raw Recorder by CyanPhase"; }
  270. }
  271.  
  272. BOOL WINAPI DllMain ( HANDLE hModule, DWORD fwdreason, LPVOID lpReserved )
  273. {
  274.     switch (fwdreason) {
  275.     case DLL_PROCESS_ATTACH: { dllInstance = (HINSTANCE) hModule; } break;
  276.     case DLL_THREAD_ATTACH: break;
  277.     case DLL_THREAD_DETACH: break;
  278.     case DLL_PROCESS_DETACH: break;
  279.     }
  280.     return TRUE;
  281. }
  282.